﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SISREBBVA.BE;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;

namespace SISREBBVA.DA
{
    public class UsuarioDA
    {
        #region SINGLETON

        private static UsuarioDA _instance = null;
        /// <summary>
        /// Devuelve una instancia del objeto
        /// </summary>
        /// <remarks></remarks>
        public static UsuarioDA GetInstance()
        {

            if ((_instance == null))
            {
                _instance = new UsuarioDA();
            }

            return _instance;

        }

        #endregion

        #region "Validar Acceso"
        public Usuario VerificarAcceso(String s_usu_correo, String s_usu_password)
        {
            Usuario registro = null;
            try
            {
                Database db = DatabaseFactory.CreateDatabase(Constants.ConnectionString);
                DbCommand cmd = db.GetStoredProcCommand("PA_USUARIO_VALIDARACCESO");
                db.AddInParameter(cmd, "@s_usu_correo", DbType.String, s_usu_correo);
                db.AddInParameter(cmd, "@s_usu_password", DbType.String, s_usu_password);

                using (IDataReader dr = db.ExecuteReader(cmd))
                {
                    if (dr.Read())
                    {
                        registro = new Usuario();
                        registro.id = dr.GetInt32(dr.GetOrdinal("n_usuario_id"));
                        registro.nombres = dr.GetString(dr.GetOrdinal("s_usu_nombres"));
                        registro.apellidos = dr.GetString(dr.GetOrdinal("s_usu_apellidos"));
                        registro.sexo = dr.GetString(dr.GetOrdinal("s_usu_sexo"));
                        registro.fechanacimiento = dr.GetDateTime(dr.GetOrdinal("d_usu_fechanacimiento"));
                        registro.direccion = dr.GetString(dr.GetOrdinal("s_usu_direccion"));
                        registro.correo = dr.GetString(dr.GetOrdinal("s_usu_correo"));
                        registro.password = dr.GetString(dr.GetOrdinal("s_usu_password"));
                        registro.codigoPostal = dr.GetString(dr.GetOrdinal("s_usu_codpostal"));
                        registro.foto = dr.GetString(dr.GetOrdinal("s_usu_foto"));
                        registro.sueldo = (float)dr.GetDecimal(dr.GetOrdinal("n_usu_sueldo"));

                        registro.listaCategorias = CategoriasxUsuario(registro.id);
                    }
                }
            }
            catch (Exception e)
            {

            }
            return registro;
        }
    

        #endregion

        #region "Insertar"
        public bool Insertar(ref Usuario usuario)
        {
            bool ok = false;
            try
            {
                Database db = DatabaseFactory.CreateDatabase(Constants.ConnectionString);
                DbCommand cmd = db.GetStoredProcCommand("PA_INSERT_USUARIO");
                db.AddOutParameter(cmd, "@n_usuario_id", DbType.Int32, 4);
                db.AddInParameter(cmd, "@s_usu_nombres", DbType.String, usuario.nombres);
                db.AddInParameter(cmd, "@s_usu_apellidos", DbType.String, usuario.apellidos);
                db.AddInParameter(cmd, "@s_usu_sexo", DbType.String, usuario.sexo);
                db.AddInParameter(cmd, "@d_usu_fechanacimiento", DbType.DateTime, usuario.fechanacimiento);
                db.AddInParameter(cmd, "@s_usu_direccion", DbType.String, usuario.direccion);
                db.AddInParameter(cmd, "@s_usu_correo", DbType.String, usuario.correo);
                db.AddInParameter(cmd, "@s_usu_codigopostal", DbType.String, usuario.codigoPostal);
                db.AddInParameter(cmd, "@s_usu_password", DbType.String, usuario.password);
                db.AddInParameter(cmd, "@s_usu_foto", DbType.String, usuario.foto);

                db.ExecuteNonQuery(cmd);

                usuario.id = Convert.ToInt32(db.GetParameterValue(cmd, "@n_usuario_id"));

                ok = true;
            }
            catch (Exception e)
            {

            }
            return ok;
        }
        #endregion

        #region "Categorias x Usuario"
        public List<Categoria> CategoriasxUsuario(int n_usuario_id)
        {
            List<Categoria> lista = new List<Categoria>();
            Categoria categoria = null;
            try
            {
                Database db = DatabaseFactory.CreateDatabase(Constants.ConnectionString);
                DbCommand cmd = db.GetStoredProcCommand("PA_GET_CATEGORIAS_X_USUARIO");
                db.AddInParameter(cmd, "@n_usuario_id", DbType.Int32, n_usuario_id);                

                using (IDataReader dr = db.ExecuteReader(cmd))
                {
                    while (dr.Read())
                    {
                        categoria = new Categoria();
                        categoria.code = dr.GetString(dr.GetOrdinal("s_cat_code"));
                        categoria.descripcion = dr.GetString(dr.GetOrdinal("s_cat_descripcion"));
                        lista.Add(categoria);
                    }
                }
            }
            catch (Exception e)
            {

            }
            return lista;
        }


        #endregion

        #region "DT Categorias x Usuario"
        public DataTable DTCategoriasxUsuario(int n_usuario_id)
        {
            DataTable dt = new DataTable();
            
            try
            {
                Database db = DatabaseFactory.CreateDatabase(Constants.ConnectionString);
                DbCommand cmd = db.GetStoredProcCommand("PA_GET_CATEGORIAS_X_FIELDS");
                db.AddInParameter(cmd, "@n_usuario_id", DbType.Int32, n_usuario_id);

                dt.Load(db.ExecuteReader(cmd));
               
            }
            catch (Exception e)
            {

            }
            return dt;
        }


        #endregion

        #region "Actualziar Usuario XML"

        public int ActualizarUsuarioXML(String xml, int n_usuario_id) 
        {            
            int resultado = 0;
            try{
                Database db = DatabaseFactory.CreateDatabase(Constants.ConnectionString);
                DbCommand cmd = db.GetStoredProcCommand("PA_UPDATE_USUARIO_XML");
                db.AddInParameter(cmd, "@xml_usuario", DbType.String, xml);
                db.AddOutParameter(cmd, "@salida", DbType.Int32, 4);
                db.AddInParameter(cmd, "@n_usuario_id", DbType.Int32, n_usuario_id);

                            
                db.ExecuteNonQuery(cmd);
                resultado = Convert.ToInt32(db.GetParameterValue(cmd, "@salida"));

            }catch(Exception e){
            }
        
            return resultado;
         }

        #endregion
    }
}
